Skip to main content

第 12 章:基礎系統設定與備份

系統基本設定

網路設定:手動設定與 DHCP 自動取得

手動設定網路

  • IP
  • 子網路遮罩(netmask)
  • 通訊閘(gateway)
  • DNS 主機的 IP (通常會有兩個,若記不住的話,硬背 168.95.1.1 即可)
  • 網路參數可自動取得 (dhcp 協定自動取得)

網卡的編號則有另一套規則,網卡的界面代號現在與網卡的來源有關

  • eno1 :代表由主機板 BIOS 內建的網卡
  • ens1 :代表由主機板 BIOS 內建的 PCI-E 界面的網卡
  • enp2s0 :代表 PCI-E 界面的獨立網卡,可能有多個插孔,因此會有 s0, s1... 的編號~
  • eth0 :如果上述的名稱都不適用,就回到原本的預設網卡編號

手動設定 IP 網路參數

  • method: manual (手動設定)
  • IP: 172.16.1.1
  • netmask: 255.255.0.0
  • gateway: 172.16.200.254
  • DNS: 172.16.200.254
  • hostname: study.centos.vbird
nmcli connection show
nmcli connection show [網卡代號]
nmcli connection show

NAME UUID TYPE DEVICE
eth0 505a7445-2aac-45c8-92df-dc10317cec22 802-3-ethernet eth0
# NAME 就是連線代號,通常與後面的網卡 DEVICE 會一樣!
# UUID 這個是特殊的裝置識別,保留就好不要理他!
# TYPE 就是網卡的類型,通常就是乙太網卡!
# DEVICE 當然就是網卡名稱囉!
# 從上面我們會知道有個 eth0 的連線代號,那麼來查察這個連線代號的設定為何?

nmcli connection show eth0
connection.id: eth0
connection.uuid: 505a7445-2aac-45c8-92df-dc10317cec22
connection.interface-name: eth0
connection.type: 802-3-ethernet
connection.autoconnect: yes
.....(中間省略).....
ipv4.method: manual
ipv4.dns:
ipv4.dns-search:
ipv4.addresses: 192.168.1.100/24
ipv4.gateway: --
.....(中間省略).....
IP4.ADDRESS[1]: 192.168.1.100/24
IP4.GATEWAY:
IP6.ADDRESS[1]: fe80::5054:ff:fedf:e174/64
IP6.GATEWAY:

如上表的輸出,最底下的大寫的 IP4, IP6 指的是目前的實際使用的網路參數,最上面的 connection 開頭的部份則指的是連線的狀態! 比較重要的參數鳥哥將它列出來如下:

  • connection.autoconnect [yes|no] :是否於開機時啟動這個連線,預設通常是 yes 才對!
  • ipv4.method [auto|manual] :自動還是手動設定網路參數的意思
  • ipv4.dns [dns_server_ip] :就是填寫 DNS 的 IP 位址
  • ipv4.addresses [IP/Netmask] :就是 IP 與 netmask 的集合,中間用斜線 / 來隔開
  • ipv4.gateway [gw_ip] :就是 gateway 的 IP 位址
nmcli connection modify
nmcli connection modify eth0 \
>connection.autoconnect yes \
>ipv4.method manual \
>ipv4.addresses 172.16.1.1/16 \
>ipv4.gateway 172.16.200.254 \
>ipv4.dns 172.16.200.254# 上面只是『修改了設定檔』而已,要實際生效還得要啟動 (up) 這個 eth0 連線界面才行喔!

nmcli connection up eth0
nmcli connection show eth0.....(前面省略).....
IP4.ADDRESS[1]: 172.16.1.1/16
IP4.GATEWAY: 172.16.200.254
IP4.DNS[1]: 172.16.200.254
IP6.ADDRESS[1]: fe80::5054:ff:fedf:e174/64
IP6.GATEWAY:
自動取得 IP 參數
nmcli connection modify eth0 \
>connection.autoconnect yes \
>ipv4.method auto

nmcli connection up eth0
nmcli connection show eth0
IP4.ADDRESS[1]: 172.16.2.76/16
IP4.ADDRESS[2]: 172.16.1.1/16
IP4.GATEWAY: 172.16.200.254
IP4.DNS[1]: 172.16.200.254

修改主機名稱
hostnamectl [set-hostname 你的主機名]# 1. 顯示目前的主機名稱與相關資訊
hostnamectl
Static hostname: study.centos.vbird # 這就是主機名稱
Icon name: computer
Chassis: n/a
Machine ID: 309eb890d09f440681f596543d95ec7a
Boot ID: b2de392ff1f74e568829c716a7166ecd
Virtualization: kvm
Operating System: CentOS Linux 7 (Core) # 作業系統名稱!
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-229.el7.x86_64 # 核心版本也提供!
Architecture: x86_64 # 硬體等級也提供!

# 2. 嘗試修改主機名稱為 www.centos.vbird 之後再改回來~
hostnamectl set-hostname www.centos.vbird
cat /etc/hostname
www.centos.vbird

hostnamectl set-hostname study.centos.vbird

日期與時間設定

時區的顯示與設定
timedatectl [commamd]

選項與參數:
list-timezones :列出系統上所有支援的時區名稱
set-timezone :設定時區位置
set-time :設定時間
set-ntp :設定網路校時系統# 1. 顯示目前的時區與時間等資訊
timedatectl
Local time: Tue 2015-09-01 19:50:09 CST # 本地時間
Universal time: Tue 2015-09-01 11:50:09 UTC # UTC 時間,可稱為格林威治標準時間
RTC time: Tue 2015-09-01 11:50:12
Timezone: Asia/Taipei (CST, +0800) # 就是時區囉!
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: n/a

# 2. 顯示出是否有 New_York 時區?若有,則請將目前的時區更新一下
timedatectl list-timezones | grep -i new
America/New_York
America/North_Dakota/New_Salem

timedatectl set-timezone "America/New_York"
timedatectl
Local time: Tue 2015-09-01 07:53:24 EDT
Universal time: Tue 2015-09-01 11:53:24 UTC
RTC time: Tue 2015-09-01 11:53:28
Timezone: America/New_York (EDT, -0400)

timedatectl set-timezone "Asia/Taipei"# 最後還是要記得改回來台灣時區喔!不要忘記了!
時間的調整
# 1. 將時間調整到正確的時間點上!
timedatectl set-time "2015-09-01 12:02"
用 ntpdate 手動網路校時
ntpdate tock.stdtime.gov.tw
1 Sep 13:15:16 ntpdate[21171]: step time server 211.22.103.157 offset -0.794360 sec

hwclock -w

語系設定

語系設定
localectl
System Locale: LANG=zh_TW.utf8 # 底下這些資料就是『系統語系』
LC_NUMERIC=zh_TW.UTF-8
LC_TIME=zh_TW.UTF-8
LC_MONETARY=zh_TW.UTF-8
LC_PAPER=zh_TW.UTF-8
LC_MEASUREMENT=zh_TW.UTF-8
VC Keymap: cn
X11 Layout: cn
X11 Options: grp:ctrl_shift_toggle

locale
LANG=zh_TW.utf8 # 底下的則是『當前這個軟體的語系』資料!
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
.....(中間省略).....
LC_ALL=en_US.utf8

問:如果圖形界面將會是中文萬國碼的提示登入字元。如何改成英文語系的登入界面? 答:就是將 locale 改成 en_US.utf8 之後,再轉成圖形界面即可!

 localectl set-locale LANG=en_US.utf8
systemctl isolate multi-user.target
systemctl isolate graphical.target

防火牆簡易設定

界域 (zone):依據不同的環境所設計的網路界域 (zone)

玩過網路後,你可能會聽過所謂的本機網路、NAT 與 DMZ 等網域,同時,可能還有可信任的 (trusted) 網域,或者是應該被抵擋 (drop/block) 的網域等等。 這些網域各有其功能~早期的 iptables 防火牆服務,所有的規則你都得要自己手動來撰寫,然後規則的細分得要自己去規劃, 所以很可能會導致一堆無法理解的規則。

新的 firewalld 服務就預先設計這些可能會被用到的網路環境,裡面的規則除了 public (公開網域) 這個界域 (zone) 之外,其它的界域則暫時為沒有啟動的狀況。 因此,在預設的情況下,如圖 20.1.2 當中的 2 號箭頭與 3 號箭頭處,你只要考慮 public 那個項目即可!其他的領域等到讀完伺服器篇之後再來討論。 所以,再說一次~你只要考慮 public 這個 zone 即可喔!

相關設定項目

防火牆規則通常需要設定的地方有:

  • 服務:一般來說,如果你的 Linux server 是作為 Internet 的伺服器,提供的是比較一般的服務,那麼只要處理『服務』項目即可。預設你的伺服器已經提供了 ssh 與 dhcpv6-client 的服務埠口喔!
  • 連接埠:如果你提供的服務所啟用的埠口並不是正規的埠口,舉例來說,為了玩 systemd 與 SELinux 我們曾經將 ssh 的埠口調整到 222 ,同時也曾經將 ftp 的埠口調整到 555 對吧!那如果你想要讓人家連進來,就不能只開放上面的『服務』項目,連這個『連接埠』的地方也需要調整才行!另外, 如果有某些比較特別的服務是 CentOS 預設沒有提供的,所以『服務』當然也就沒有存在!這時你也可以直接透過連接埠來搞定它!
  • 豐富規則(rich rule):如果你有『整個網域』需要放行或者是拒絕的時候,那麼前兩個項目就沒有辦法適用, 這時就得要這個項目來處理了。不過鳥哥測試了 7.1 這一版的設定,似乎怪怪的~因此,底下我們會以 firewall-cmd 來增加這一個項目的設定。
  • 介面:就是這個界域主要是針對哪一個網路卡來做規範的意思,我們只有一張網卡,所以當然就是 eth0 囉!

至於『偽裝』、『連接埠轉送』、『ICMP過濾器』、『來源』等等我們就不介紹了!畢竟那個是網路的東西,還不是在基礎篇應該要告訴你的項目。 好了!現在假設我們的 Linux server 是要作為底下的幾個重要的服務與相關的網域功能,你該如何設定防火牆呢?

  • 要作為 ssh, www, ftp, https 等等正規埠口的服務;
  • 同時與前幾章搭配,還需要放行 port 222 與 port 555 喔!
  • 區域網路 192.168.1.0/24 這一段我們目前想要直接放行這段網域對我們伺服器的連線

最後一個要處理的是區域網路的放行,我們剛剛談到這個部份恐怕目前的圖形界面軟體有點怪異~所以,這時你可以這樣下達指令即可! 注意,下列的指令全部都是必要參數,只有 IP 網段的部份可以變動掉即可!

firewall-cmd
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" \
>source address="192.168.1.0/24" accept'
success
firewall-cmd --reload

以系統內建 dmidecode 解析硬體配備

系統有個名為 dmidecode 的軟體,這個軟體挺有趣的,它可以解析 CPU 型號、主機板型號與記憶體相關的型號等等~ 相當的有幫助!尤其是在升級配備上面!現在讓我們來查一查鳥哥的虛擬機裡頭有啥東西吧!

dmidecode
dmidecode -t type

選項與參數:
詳細的 type 項目請 man dmidecode 查詢更多的資料,這裡僅列出比較常用的項目:
1 :詳細的系統資料,含主機板的型號與硬體的基礎資料等
4 :CPU 的相關資料,包括倍頻、外頻、核心數、核心緒數等
9 :系統的相關插槽格式,包括 PCI, PCI-E 等等的插槽規格說明
17:每一個記憶體插槽的規格,若內有記憶體,則列出該記憶體的容量與型號範例一:秀出整個系統的硬體資訊,例如主機板型號等等
dmidecode -t 1
# dmidecode 2.12
SMBIOS 2.4 present.

Handle 0x0100, DMI type 1, 27 bytes
System Information
Manufacturer: Red Hat
Product Name: KVM
Version: RHEL 6.6.0 PC
Serial Number: Not Specified
UUID: AA3CB5D1-4F42-45F7-8DBF-575445D3887F
Wake-up Type: Power Switch
SKU Number: Not Specified
Family: Red Hat Enterprise Linux

範例二:那記憶體相關的資料呢?
dmidecode -t 17
# dmidecode 2.12
SMBIOS 2.4 present.

Handle 0x1100, DMI type 17, 21 bytes
Memory Device
Array Handle: 0x1000
Error Information Handle: 0x0000
Total Width: 64 bits
Data Width: 64 bits
Size: 3072 MB
Form Factor: DIMM
Set: None
Locator: DIMM 0
Bank Locator: Not Specified
Type: RAM
Type Detail: None

硬體資源的收集與分析

除了直接呼叫出 /proc 底下的檔案內容之外,其實 Linux 有提供幾個簡單的指令來將核心所偵測到的硬體叫出來的~ 常見的指令有底下這些:

  • gdisk:可以使用 gdisk -l 將分割表列出
  • dmesg:觀察核心運作過程當中所顯示的各項訊息記錄
  • vmstat:可分析系統 (CPU/RAM/IO) 目前的狀態
  • lspci:列出整個 PC 系統的 PCI 介面裝置!很有用的指令
  • lsusb:列出目前系統上面各個 USB 埠口的狀態,與連接的 USB 裝置
  • iostat:與 vmstat 類似,可即時列出整個 CPU 與周邊設備的 Input/Output 狀態

lspci 列出整個 PC 系統的 PCI 介面裝置

lspci
lspci [-vvn]

選項與參數:
-v :顯示更多的 PCI 介面裝置的詳細資訊;
-vv :比 -v 還要更詳細的細部資訊;
-n :直接觀察 PCI 的 ID 而不是廠商名稱範例一:查閱您系統內的 PCI 匯流排相關裝置:
lspci00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01)
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
00:02.0 VGA compatible controller: Red Hat, Inc. QXL paravirtual graphic card (rev 04)
00:03.0 Ethernet controller: Red Hat, Inc Virtio network device
00:04.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:05.0 RAM memory: Red Hat, Inc Virtio memory balloon
00:06.0 Audio device: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) High Definition Audio
Controller (rev 01)
00:1d.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1 (rev 03)
00:1d.1 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #2 (rev 03)
00:1d.2 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3 (rev 03)
00:1d.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1 (rev 03)
# 不必加任何的參數,就能夠顯示出目前主機上面的各個 PCI 介面的裝置呢!

不必加上任何選項,就能夠顯示出目前的硬體配備為何。上面就是鳥哥的測試機所使用的主機配備。 包括使用 Intel 晶片的模擬主機板、南橋使用 ICH9 的控制晶片、附掛 QXL 的顯示卡、使用虛擬化的 Virtio 網路卡等等。 您瞧瞧!很清楚,不是嘛。

如果你還想要瞭解某個設備的詳細資訊時,可以加上 -v 或 -vv 來顯示更多的資訊喔! 舉例來說,鳥哥想要知道那個乙太網路卡更詳細的資訊時,可以使用如下的選項來處理:

lspci -s 00:03.0 -vv
  • s 後面接的那個怪東西每個設備的匯流排、插槽與相關函數功能啦!那個是我們硬體偵測所得到的數據囉! 你可以對照底下這個檔案來瞭解該串數據的意義:
  • /usr/share/hwdata/pci.ids

其實那個就是 PCI 的標準 ID 與廠牌名稱的對應表啦!此外,剛剛我們使用 lspci 時,其實所有的資料都是由 /proc/bus/pci/ 目錄下的資料所取出的呢!瞭解了吧! ^_^!不過,由於硬體的發展太過迅速,所以你的 pci.ids 檔案可能會落伍了~那怎辦? 沒關係~可以使用底下的方式來線上更新你的對應檔:

update-pciids

lsusb 列出目前系統上面各個 USB 埠口的狀態

剛剛談到的是 PCI 介面裝置,如果是想要知道系統接了多少個 USB 裝置呢?那就使用 lsusb 吧!這個指令也是很簡單的!

lsusb
lsusb [-t]

選項與參數:
-t :使用類似樹狀目錄來顯示各個 USB 埠口的相關性範例一:列出目前鳥哥的測試用主機 USB 各埠口狀態
lsusb
Bus 002 Device 002: ID 0627:0001 Adomax Technology Co., Ltd
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
# 如上所示,鳥哥的主機在 Bus 002 有接了一個設備,
# 該設備的 ID 是 0627:0001,對應的廠商與產品為 Adomax 的設備。

確實非常清楚吧!其中比較有趣的就屬那個 ID 號碼與廠商型號對照了!那也是寫入在 /usr/share/hwdata/pci.ids 的東西,你也可以自行去查詢一下喔!

iostat 列出整個 CPU 與周邊設備的 Input/Output 狀態

iostat
iostat [-c|-d] [-k|-m] [-t] [間隔秒數] [偵測次數]

選項與參數:
-c :僅顯示 CPU 的狀態;
-d :僅顯示儲存設備的狀態,不可與 -c 一起用;
-k :預設顯示的是 block ,這裡可以改成 K bytes 的大小來顯示;
-m :與 -k 類似,只是以 MB 的單位來顯示結果。
-t :顯示日期出來;範例一:顯示一下目前整個系統的 CPU 與儲存設備的狀態
iostat
Linux 3.10.0-229.el7.x86_64 (study.centos.vbird) 09/02/2015 _x86_64_ (4 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.08 0.01 0.02 0.00 0.01 99.88

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.46 5.42 3.16 973670 568007
scd0 0.00 0.00 0.00 154 0
sda 0.01 0.03 0.00 4826 0
dm-0 0.23 4.59 3.09 825092 555621
# 瞧!上面數據總共分為上下兩部分,上半部顯示的是 CPU 的當下資訊;
# 下面數據則是顯示儲存裝置包括 /dev/vda 的相關數據,他的數據意義:
# tps :平均每秒鐘的傳送次數!與資料傳輸『次數』有關,非容量!
# kB_read/s :開機到現在平均的讀取單位;
# kB_wrtn/s :開機到現在平均的寫入單位;
# kB_read :開機到現在,總共讀出來的檔案單位;
# kB_wrtn :開機到現在,總共寫入的檔案單位;範例二:僅針對 vda ,每兩秒鐘偵測一次,並且共偵測三次儲存裝置
iostat -d 2 3 vda
Linux 3.10.0-229.el7.x86_64 (study.centos.vbird) 09/02/2015 _x86_64_ (4 CPU)

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.46 5.41 3.16 973682 568148

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 1.00 0.00 0.50 0 1

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.00 0.00 0.00 0 0
# 仔細看一下,如果是有偵測次數的情況,那麼第一次顯示的是『從開機到現在的數據』,
# 第二次以後所顯示的資料則代表兩次偵測之間的系統傳輸值!舉例來說,上面的資訊中,
# 第二次顯示的資料,則是兩秒鐘內(本案例)系統的總傳輸量與平均值。

瞭解磁碟的健康狀態

SMART 其實是『 Self-Monitoring, Analysis and Reporting Technology System 』的縮寫,主要用來監測目前常見的 ATA 與 SCSI 界面的磁碟, 只是,要被監測的磁碟也必須要支援 SMART 的協定才行!否則 smartd 就無法去下達指令,讓磁碟進行自我健康檢查。smartd 提供一隻指令名為 martctl,這個指令功能非常多。

smartctl
# 1. 用 smartctl 來顯示完整的 /dev/sda 的資訊
smartctl -a /dev/sda
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.10.0-229.el7.x86_64] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

# 首先來輸出一下這部磁碟的整體資訊狀況!包括製造商、序號、格式、SMART 支援度等等!
=== START OF INFORMATION SECTION ===
Device Model: QEMU HARDDISK
Serial Number: QM00002
Firmware Version: 0.12.1
User Capacity: 2,148,073,472 bytes [2.14 GB]
Sector Size: 512 bytes logical/physical
Device is: Not in smartctl database [for details use: -P showall]
ATA Version is: ATA/ATAPI-7, ATA/ATAPI-5 published, ANSI NCITS 340-2000
Local Time is: Wed Sep 2 18:10:38 2015 CST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

# 接下來則是一堆基礎說明!鳥哥這裡先略過這段資料喔!
General SMART Values:
Offline data collection status: (0x82) Offline data collection activity
was completed without error.
Auto Offline Data Collection: Enabled.
.....(中間省略).....
# 再來則是有沒有曾經發生過磁碟錯亂的問題登錄!
SMART Error Log Version: 1
No Errors Logged

# 當你下達過磁碟自我檢測的過程,就會被記錄在這裡了!
SMART Self-test log structure revision number 1
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
# 1 Short offline Completed without error 00% 4660 -
# 2 Short offline Completed without error 00% 4660 -

# 2. 命令磁碟進行一次自我檢測的動作,然後再次觀察磁碟狀態!
smartctl -t short /dev/sda
smartctl -a /dev/sda.....(前面省略).....
# 底下會多出一個第三筆的測試資訊!看一下 Status 的狀態,沒有問題就是好消息!
SMART Self-test log structure revision number 1
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
# 1 Short offline Completed without error 00% 4660 -
# 2 Short offline Completed without error 00% 4660 -
# 3 Short offline Completed without error 00% 4660 -

備份

哪些 Linux 資料具有備份的意義

一般來說,鳥哥比較喜歡備份最重要的檔案而已 (關鍵資料備份),而不是整個系統都備份起來 (完整備份, Full backup)!那麼哪些檔案是有必要備份的呢?具有備份意義的檔案通常可以粗分為兩大類,一類是系統基本設定資訊、一類則是類似網路服務的內容資料。 那麼各有哪些檔案需要備份的呢?我們就來稍微分析一下。

作業系統本身需要備份的檔案

  • /etc/ 整個目錄
  • /home/ 整個目錄
  • /var/spool/mail/
  • /var/spool/{at|cron}/
  • /boot/
  • /root/

網路服務的資料庫方面

若我們假設我們提供的服務軟體都是使用原廠的 RPM 安裝的!所以要備份的資料檔案有:

  • 軟體本身的設定檔案,例如:/etc/ 整個目錄,/usr/local/ 整個目錄
  • 軟體服務提供的資料,以 WWW 及 Mariadb 為例:WWW 資料:/var/www 整個目錄或 /srv/www 整個目錄,及系統的使用者家目錄Mariadb : /var/lib/mysql 整個目錄
  • 其他在 Linux 主機上面提供的服務之資料庫檔案!

推薦需要備份的目錄

  • /etc
  • /home
  • /root
  • /var/spool/mail/, /var/spool/cron/, /var/spool/at/
  • /var/lib/

不需要備份的目錄

  • /dev:這個隨便你要不要備份
  • /proc, /sys, /run:這個真的不需要備份啦!
  • /mnt, /media:如果你沒有在這個目錄內放置你自己系統的東西,也不需要備份
  • /tmp:幹嘛存暫存檔!不需要備份!

累積備份使用的備份軟體

完整備份常用的工具有 ddcpioxfsdump/xfsrestore 等等。因為這些工具都能夠備份裝置與特殊檔案! dd 可以直接讀取磁碟的磁區 (sector) 而不理會檔案系統,是相當良好的備份工具!不過缺點就是慢很多! cpio 是能夠備份所有檔名,不過,得要配合 find 或其他找檔名的指令才能夠處理妥當。以上兩個都能夠進行完整備份, 但累積備份就得要額外使用腳本程式來處理。可以直接進行累積備份的就是 xfsdump 這個指令囉!詳細的指令與參數用法, 請前往第八章查閱,這裡僅列出幾個簡單的範例而已。

# 1. 用 dd 來將 /dev/sda 備份到完全一模一樣的 /dev/sdb 硬碟上:
dd if=/dev/sda of=/dev/sdb# 由於 dd 是讀取磁區,所以 /dev/sdb 這顆磁碟可以不必格式化!非常的方便!
# 只是你會等非常非常久!因為 dd 的速度比較慢!# 2. 使用 cpio 來備份與還原整個系統,假設儲存媒體為 SATA 磁帶機:
find / -print | cpio -covB > /dev/st0 <==備份到磁帶機
cpio -iduv < /dev/st0 <==還原

假設 /home 為一個獨立的檔案系統,而 /backupdata 也是一個獨立的用來備份的檔案系統,那如何使用 dump 將 /home 完整的備份到 /backupdata 上呢?可以像底下這樣進行看看:

# 1. 完整備份
xfsdump -l 0 -L 'full' -M 'full' -f /backupdata/home.dump /home# 2. 第一次進行累積備份
xfsdump -l 1 -L 'full-1' -M 'full-1' -f /backupdata/home.dump1 /home

除了這些指令之外,其實 tar 也可以用來進行完整備份啦!舉例來說,/backupdata 是個獨立的檔案系統, 你想要將整個系統通通備份起來時,可以這樣考慮:將不必要的 /proc, /mnt, /tmp 等目錄不備份,其他的資料則予以備份:

tar --exclude /proc --exclude /mnt --exclude /tmp \
>--exclude /backupdata -jcvp -f /backupdata/system.tar.bz2 /

完整備份之差異備份 (Differential backup)

差異備份與累積備份有點類似,也是需要進行第一次的完整備份後才能夠進行。只是差異備份指的是:每次的備份都是與原始的完整備份比較的結果。所以系統運作的越久,離完整備份時間越長, 那麼該次的差異備份資料可能就會越大!差異備份的示意圖如下所示:

差異備份常用的工具與累積備份差不多!因為都需要完整備份嘛!如果使用 xfsdump 來備份的話,那麼每次備份的等級 (level) 就都會是 level 1 的意思啦!當然啦,你也可以透過 tar 的 -N 選項來備份喔!如下所示:

tar -N '2015-09-01' -jpcv -f /backupdata/home.tar.bz2 /home# 只有在比 2015-09-01 還要新的檔案,在 /home 底下的檔案才會被打包進 home.bz2 中!
# 有點奇怪的是,目錄還是會被記錄下來,只是目錄內的舊檔案就不會備份。

此外,你也可以透過 rsync 來進行鏡像備份喔! 這個 rsync 可以對兩個目錄進行鏡像 (mirror) ,算是一個非常快速的備份工具!簡單的指令語法為:

rsync -av 來源目錄 目標目錄# 1. 將 /home/ 鏡像到 /backupdata/home/ 去
rsync -av /home /backupdata/# 此時會在 /backupdata 底下產生 home 這個目錄來!
rsync -av /home /backupdata/# 再次進行會快很多!如果資料沒有更動,幾乎不會進行任何動作!

根據分析 (註2) ,差異備份所使用的磁碟容量可能會比累積備份來的大,但是差異備份的還原較快, 因為只需要還原完整備份與最近一次的差異備份即可。無論如何,請依據你自己的喜好來選擇備份的方式吧!

關鍵資料備份

依據日期來備份 mariadb 的資料庫喔!

tar -jpcvf mysql.`date +%Y-%m-%d`.tar.bz2 /var/lib/mysq

備份策略範例

每部主機的任務都不相同,重要的資料也不相同,重要性也不一樣,因此,每個人的備份思考角度都不一樣! 有些備份策略是非常有趣的,包括使用多個磁帶機與磁帶來自動備份企業資料。

  1. 主機硬體:使用一個獨立的 filesystem 來儲存備份資料,此 filesystem 掛載到 /backup 當中;
  2. 每日進行:目前僅備份 MySQL 資料庫;
  3. 每週進行:包括 /home, /var, /etc, /boot, /usr/local 等目錄與特殊服務的目錄;
  4. 自動處理:這方面利用 /etc/crontab 來自動提供備份的進行;
  5. 異地備援:每月定期的將資料分別 (a)燒錄到光碟上面 (b)使用網路傳輸到另一部機器上面。

每週系統備份的 script

每週系統備份的 script
vi /backup/backupwk.sh
#!/bin/bash
# ====================================================================
# 使用者參數輸入位置:
# basedir=你用來儲存此腳本所預計備份的資料之目錄(請獨立檔案系統)
basedir=/backup/weekly <==您只要改這裡就好了!

# ====================================================================
# 底下請不要修改了!用預設值即可!
PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH
export LANG=C

# 設定要備份的服務的設定檔,以及備份的目錄
named=$basedir/named
postfixd=$basedir/postfix
vsftpd=$basedir/vsftp
sshd=$basedir/ssh
sambad=$basedir/samba
wwwd=$basedir/www
others=$basedir/others
userinfod=$basedir/userinfo
# 判斷目錄是否存在,若不存在則予以建立。
for dirs in $named $postfixd $vsftpd $sshd $sambad $wwwd $others $userinfod
do
[ ! -d "$dirs" ] && mkdir -p $dirs
done

# 1. 將系統主要的服務之設定檔分別備份下來,同時也備份 /etc 全部。
cp -a /var/named/chroot/{etc,var} $named
cp -a /etc/postfix /etc/dovecot.conf $postfixd
cp -a /etc/vsftpd/* $vsftpd
cp -a /etc/ssh/* $sshd
cp -a /etc/samba/* $sambad
cp -a /etc/{my.cnf,php.ini,httpd} $wwwd
cd /var/lib
tar -jpc -f $wwwd/mysql.tar.bz2 mysql
cd /var/www
tar -jpc -f $wwwd/html.tar.bz2 html cgi-bin
cd /
tar -jpc -f $others/etc.tar.bz2 etc
cd /usr/
tar -jpc -f $others/local.tar.bz2 local

# 2. 關於使用者參數方面
cp -a /etc/{passwd,shadow,group} $userinfod
cd /var/spool
tar -jpc -f $userinfod/mail.tar.bz2 mail
cd /
tar -jpc -f $userinfod/home.tar.bz2 home
cd /var/spool
tar -jpc -f $userinfod/cron.tar.bz2 cron at

chmod 700 /backup/backupwk.sh
/backup/backupwk.sh <==記得自己試跑看看!

每日備份資料的 script

每日備份資料的 script
vi /backup/backupday.sh
#!/bin/bash
# =========================================================
# 請輸入,你想讓備份資料放置到那個獨立的目錄去
basedir=/backup/daily/ <==你只要改這裡就可以了!

# =========================================================
PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH
export LANG=C
basefile1=$basedir/mysql.$(date +%Y-%m-%d).tar.bz2
basefile2=$basedir/cgi-bin.$(date +%Y-%m-%d).tar.bz2
[ ! -d "$basedir" ] && mkdir $basedir

# 1. MysQL (資料庫目錄在 /var/lib/mysql)
cd /var/lib
tar -jpc -f $basefile1 mysql

# 2. WWW 的 CGI 程式 (如果有使用 CGI 程式的話)
cd /var/www
tar -jpc -f $basefile2 cgi-bin

chmod 700 /backup/backupday.sh
/backup/backupday.sh <==記得自己試跑看看!

vi /etc/crontab# 加入這兩行即可 (請注意你的檔案目錄!不要照抄呦!)30 3 * * 0 root /backup/backupwk.sh
30 2 * * * root /backup/backupday.sh

遠端備援的 script

使用 rsync 上傳備份資料

要使用 rsync 你必須要在你的伺服器上面取得某個帳號使用權後, 並讓該帳號可以不用密碼即可登入才行!這部分得要先參考伺服器篇的遠端連線伺服器才行! 假設你已經設定好 dmtsai 這個帳號可以不用密碼即可登入遠端伺服器,而同樣的你要讓 /backup/weekly/ 整個備份到 /home/backup/weekly 底下。

遠端備援的 script
vi /backup/rsync.sh
#!/bin/bash
remotedir=/home/backup/
basedir=/backup/weekly
host=127.0.0.1
id=dmtsai

# 底下為程式階段!不需要修改喔!
rsync -av -e ssh $basedir ${id}${host}:$@{remotedir}